from rest_framework.generics import ListAPIView, RetrieveAPIView
from rest_framework.viewsets import ReadOnlyModelViewSet
from rest_framework_extensions.cache.mixins import CacheResponseMixin

from areas.models import Area
from areas.serializers import AreaSerializer, AreaSubSerializer


"""
由于省市区的数据固定且经常被使用,因此将省市区的数据进行缓存处理,减少数据库的查询次数
drf中使用缓存可以通过drf-extensoions扩展来实现,以下是扩展类:
    CacheResponseMixin为视图集同时补充List和Retrieve两种缓存
    ListCacheResponseMixin 用于缓存返回列表数据的视图,与ListModelMixin扩展类配合使用,实际是为list方法添加了cache_response装饰器
    RetrieveCacheResponseMixin 用于缓存返回单一数据的视图,与RetrieveModelMixin扩展类配合使用,实际是为retrieve方法添加了cache_response装饰器
而配置了缓存扩展类后

"""
# AreaListView和AreaRetrieveView的合并
class AreasViewSet(CacheResponseMixin, ReadOnlyModelViewSet):
    """行政区划信息"""
    pagination_class = None  # 区划信息不分页

    # action: 指定请求方式与处理函数的对应关系   list/retrieve
    def get_queryset(self):
        """提供数据集"""
        if self.action == 'list':
            return Area.objects.filter(parent__isnull=True)  # 即parent=None
        else:
            return Area.objects.all()

    def get_serializer_class(self):
        """提供序列化器"""
        if self.action == 'list':
            return AreaSerializer
        else:
            return AreaSubSerializer

'''
请求省份数据时:
    请求方式: GET /areas/
    请求参数: 无
    返回数据: id  name

请求市/区数据:
    请求方式: GET /areas/(?P<pk>\d+)/
    请求参数: 路径参数pk
    返回数据: id  name  subs 下辖所有区划信息

class AreaListView(ListAPIView):
    """查询所有省/市/区"""
    queryset = Area.objects.filter(parent__isnull=True)
    serializer_class = AreaSerializer


class AreaRetrieveView(RetrieveAPIView):
    """查询一个省/市/区,并包含其直接下辖地区"""
    queryset = Area.objects.all()
    serializer_class = AreaSubSerializer
'''
